﻿using System;
using System.Xml;

namespace Narau.Common
{
    //-----------------------------------------------------------
    // Resultados asociados a un ejercicio para un usuario dado
    //-----------------------------------------------------------
    class MondaiResult
    {
        // Tags del XML
        private static string S_UID = "uid"; 
        private static string S_NumVecesBien = "NumBien";
        private static string S_NumVecesMal = "NumMal";
        private static string S_TickUV = "TickUV";
        private static string S_ResultUV = "Result"; 


        // Nodo de datos correspondiente en el XML
        private XmlNode m_xml_node;

        // Sistema de puntuación de ejercicios
        private int m_numVecesBien;
        private int m_numVecesMal;
        private int m_tickUV;
        private int m_iResultUV;
        private int m_UID;

        public int UID
        {
            get { return m_UID; }
            set
            {
                if (m_xml_node != null)
                {
                    XmlAttribute xml_attr = m_xml_node.Attributes[S_UID];
                    if (xml_attr != null)
                    {
                        xml_attr.Value = Convert.ToString(value);
                    }
                }
                m_UID = value;
            }
        }
        public int NumBien { get { return m_numVecesBien; } }
        public int NumMal  { get { return m_numVecesMal; } }


        //[H][?]
        /*public MondaiResult(XmlNode mondai_result_xml_node)
        {
            
        }*/

        //------------------------------------------------------------------------------
        // Lee los datos del nodo XML correspondiente al resultado de ejercicio actual
        //------------------------------------------------------------------------------
        public void LoadData(XmlNode xml_node_result)
        {
            m_xml_node = xml_node_result;

            m_UID          = ReadAttribute(xml_node_result, S_UID);
            m_numVecesBien = ReadAttribute(xml_node_result, S_NumVecesBien);
            m_numVecesMal  = ReadAttribute(xml_node_result, S_NumVecesMal);
            m_tickUV       = ReadAttribute(xml_node_result, S_TickUV);
            m_iResultUV    = ReadAttribute(xml_node_result, S_ResultUV);
        }

        //-----------------------------------------------------------------------
        // Función de utilidad para leer un atributo dado 'name' de un nodo XML
        //-----------------------------------------------------------------------
        private int ReadAttribute(XmlNode node, string name)
        {
            int iRetVal = 0;

            XmlAttribute xml_attr = node.Attributes[name];
            if (xml_attr != null)
            {
                iRetVal = Convert.ToInt32(xml_attr.Value);
            }

            return iRetVal;
        }

        //--------------------------------------------
        // Actualiza los datos del nodo XML asociado
        //--------------------------------------------
        public void UpdateXML()
        {
            if (m_xml_node != null)
            {
                WriteAttribute(m_xml_node, S_UID, m_UID);
                WriteAttribute(m_xml_node, S_NumVecesBien, m_numVecesBien);
                WriteAttribute(m_xml_node, S_NumVecesMal, m_numVecesMal);
                WriteAttribute(m_xml_node, S_TickUV, m_tickUV);
                WriteAttribute(m_xml_node, S_ResultUV, m_iResultUV);
            }
        }

        //------------------------------------------------------------------------
        // Función de utilidad para escribir un valor en un atributo dado 'name'
        // de un nodo XML dado
        //------------------------------------------------------------------------
        private void WriteAttribute(XmlNode node, string name, int iValue)
        {
            XmlAttribute xml_attr = node.Attributes[name];
            if (xml_attr != null)
            {
                xml_attr.Value = Convert.ToString(iValue);
            }
        }

        //-------------------------------------------------------------------
        // Crea un nodo XML con los datos del resultado de ejercicio, hijo
        // del nodo pasado en el parámetro
        //-------------------------------------------------------------------
        public void CreateXmlNode(XmlNode xml_node_parent)
        {
            XmlDocument xml_doc = xml_node_parent.OwnerDocument;
            XmlNode new_node = xml_doc.CreateNode(XmlNodeType.Element, "result", "");

            new_node.Attributes.Append(xml_doc.CreateAttribute(S_UID));
            new_node.Attributes.Append(xml_doc.CreateAttribute(S_NumVecesBien));
            new_node.Attributes.Append(xml_doc.CreateAttribute(S_NumVecesMal));
            new_node.Attributes.Append(xml_doc.CreateAttribute(S_TickUV));
            new_node.Attributes.Append(xml_doc.CreateAttribute(S_ResultUV));

            xml_node_parent.AppendChild(new_node);

            m_xml_node = new_node;
            UpdateXML();
        }

        //--------------------------------------------------------------------------
        // Fórmula para determinar si un ejercicio está resuelto bien y afianzado
        //--------------------------------------------------------------------------
        public bool IsOk()
        {
            //return (m_numVecesBien > 4) && ((m_numVecesMal / m_numVecesBien) < 0.25) && (m_iResultUV == 1);
            return (m_iResultUV == 1);
        }

        //--------------------------------------------------------------------------------
        // Llamando con TRUE se cuenta un acierto. Llamando con FALSE se cuenta un fallo
        //--------------------------------------------------------------------------------
        public void SetMaru(int iTick, bool bOK)
        {
            m_tickUV = iTick;

            if (bOK)
            {
                m_numVecesBien++;
                m_iResultUV = 1;
            }
            else
            {
                m_numVecesMal++;
                m_iResultUV = 0;
            }
        }
    }
}
